//
//  list.h
//  ADT
//
//  Created by chenyh on 2021/1/20.
//

#ifndef list_h
#define list_h

#include <stdio.h>

#include <stdbool.h> //C99 特性
/**
 类型名：     简单链表
 类型属性：   可以存储一系列项
 类型操作：   初始化链表为空
            确定链表为空
            确定链表已满
            确定链表中的项数
            在链表末尾添加项
            遍历链表、处理链表中的项
            清空链表
 */

#define TSIZE 45 //存储电影名的数组大小
struct film
{
    char title[TSIZE];
    int rating;
};
typedef struct film Item;

/**在链表的实现中，每一个链接叫做节点，每个节点包含形成链表内容的信息和指向下一个node的指针
 为了管理链表我们还需要一个指向链表开始处的指针
 我们使用typedef把list作为该类型的指针名。
 */

typedef struct node
{
    Item item;
    struct node * next;
} Node;
typedef Node * List;

//enum bool {false,true}; //把bool定义为类型，false和true是该类型的值
/* 函数原型 */

/// 始化一个链表
/// @param plist plist指向一个链表，链表初始化为空
void InitializeList(List * plist);

/// 确定链表是否为空定义，如果链表为空，该函数返回true;否则返回false
/// @param plist plist指向一个已初始化的链表
bool ListIsEmpty(const List * plist);

/// 确定链表是否已满，如果链表已满，该函数返回真;否则返回假
/// @param plist plist指向一个已初始化的链表
bool ListIsFull(const List * plist);

/// 确定链表中的项数,该函数返回链表中的项数
/// @param plist 指向一个已初始化的链表
unsigned int ListItemCount(const List * plist);

/// 在链表的末尾添加项,如果可以，该函数在链表末尾添加一个项，且返回true，否则false
/// @param item 一个待添加至链表的项
/// @param plist 一个已初始化的链表
bool AddItem(Item item,List * plist);

/// 把函数作用于链表中的每一项，pfun指向的函数作用于链表中的每一项一次
/// @param plist 指向一个已初始化的链表
/// @param pfun 指向一个函数，该函数接受一个Item类型的参数,且无返回值
void Traverse(const List * plist,void(*pfun)(Item item));

/// 释放已分配的内存（如果有的话）,释放了为链表分配的所有内存，链表设置为空。
/// @param plist 指向一个已初始化的链表
void EmptyTheList(List * plist);


#endif /* list_h */
